package Servlet;

import Dao.Impl.KnowledgeBaseDAOImpl;
import Dao.Impl.KnowledgeBaseMemberDAOImpl;
import Dao.Impl.UserDAOImpl;
import Dao.KnowledgeBaseDAO;
import Dao.KnowledgeBaseMemberDAO;
import Dao.UserDAO;
import Dto.UserDto;
import Service.KnowledgeBaseService;
import Service.UserService;
import com.fasterxml.jackson.databind.ObjectMapper;
import entity.User;
import exception.BusinessException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.JSONException;
import org.json.JSONObject;
import req.KnowledgeBaseRequest;
import utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * @Author Su
 * @Date 2025/5/1 15:59
 * @Version 1.0 （版本号）
 */

//用户资料管理，处理用户个人资料的获取和更新操作，包括基本信息的修改和头像上传功能

// Servlet类注解定义 处理路径为/api/user/profile
@WebServlet("/api/user/profile")
public class UserProfileServlet extends HttpServlet {
    // 依赖的服务组件
    private UserService userService;// 用户服务业务逻辑
    private ObjectMapper objectMapper;// JSON处理工具

    @Override
    public void init() throws ServletException {
        try {
            Connection connection = DBUtil.getConnection();
            // 初始化用户服务
            userService = new UserService(connection);
            // 初始化Jackson JSON处理器
            this.objectMapper = new ObjectMapper();
        } catch (SQLException e) {
            // 数据库连接失败时抛出Servlet初始化异常
            throw new ServletException("初始化失败", e);
        }
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 统一设置编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //构建json响应对象
        JSONObject responseJson = new JSONObject();

        try {
            // 检查登录状态，会话是否存在，不存在就是没登录，false 表示不创建新会话
            HttpSession session = req.getSession(false);
            if (session == null) {
                responseJson.put("code", 401);
                responseJson.put("message", "未登录");
                resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }

            // 从Session）中获取当前登录用户
            User user = (User) session.getAttribute("user");
            //查看用户详细信息，get user name
            //********
            // 处理前端传递的用户名参数
            String reqUsername = req.getParameter("username");
            System.out.println("携带的用户名参数：" + reqUsername);

            //决定最终要查询的用户名
            String username = reqUsername == null ? user.getUsername() : reqUsername;
            System.out.println("要查询的用户名是：" + username);
            User findUser = userService.findByUsername(username);

            //**********1.需要检查权限！比如：
            //普通用户只能查自己 if(!isAdmin && !username.equals(currentUser))
            //管理员才能查其他人
            //2.敏感的 比如密码 不应直接返回给前端

            //构建 成功的resp
            responseJson.put("code", 200);
            responseJson.put("message", "请求成功");


            // 使用ObjectMapper将用户对象，就是find user对象，转为JSON字符串，再转为JSONObject保持结构一致
            //Jackson库中的核心类，主要用于Java对象与JSON数据之间的相互转换
            if(findUser != null){
                responseJson.put("data", new JSONObject(objectMapper.writeValueAsString(findUser)));
            }
        } catch (JSONException e) {
            responseJson.put("code", 400);
            responseJson.put("message", "请求参数错误");
            resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (SQLException e) {
            responseJson.put("code", 500);
            responseJson.put("message", "系统错误");
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        } finally {
            resp.getWriter().print(responseJson.toString());
        }
    }

    //处理POST请求 资料更新与头像上传，处理 文件上传的表单数据
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 统一设置编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");
        JSONObject responseJson = new JSONObject();

        try {
            // 检查登录状态
            HttpSession session = req.getSession(false);//获取当前会话 不创建新会话
            if (session == null) {
                responseJson.put("code", 401);
                responseJson.put("message", "未登录");
                resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }
            //从session获取已登录的user
            User user = (User) session.getAttribute("user");
            // 配置上传参数，文件上传配置

            // 内存缓冲区管理
            //DiskFileItemFactory：Apache Commons FileUpload的核心类，负责：
            //设置内存缓冲区大小（默认10KB）
            //指定临时文件存储目录
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //解析器功能：处理multipart/form-data请求
            ServletFileUpload upload = new ServletFileUpload(factory);

            // 创建UserDto对象用于存储解析的数据
            UserDto userDto = new UserDto();

            // 解析请求的内容提取文件数据  // 解析multipart/form-data请求
            //UserDto：数据传输对象(Data Transfer Object)
            //parseRequest(req)：解析HTTP请求，返回表单字段和文件项的列表
            List<FileItem> formItems = upload.parseRequest(req);

                // 处理表单字段和文件
            if (formItems != null && formItems.size() > 0) {

                // 遍历表单项
                for (FileItem item : formItems) {
                    //1. 处理表单字段
                    if (item.isFormField()) {//判断是否为普通表单字段
                        String fieldName = item.getFieldName();//获取表单字段名
                        String fieldValue = item.getString("UTF-8");

                        // switch case 根据字段名设置UserDto属性
                        switch (fieldName) {
                            case "userId":
                                userDto.setUserId(Integer.parseInt(fieldValue));
                                break;
                            case "username":
                                userDto.setUsername(fieldValue);
                                break;
                            case "password":
                                userDto.setPassword(fieldValue);
                                break;
                            case "email":
                                userDto.setEmail(fieldValue);
                                break;
                        }
                    } else {
                        // 2.处理文件 文件上传处理
                        if ("file".equals(item.getFieldName()) && !item.getName().isEmpty()) {
                            // 获取文件名
                                                 //获取上传文件民    //获取文件扩展名位置，avatar.png）截取最后.后的部分（.png）
                                                                  //确保保存的文件保持原始格式（否则图片可能无法打开）
                            String fileExtension = item.getName().substring(item.getName().lastIndexOf("."));
                            // 生成唯一文件名，避免文件名冲突（多人上传同名文件）          //给了个时间戳，不会同名
                            String fileName = "user_" + user.getUserId() + "_" + System.currentTimeMillis() + fileExtension;
                            // 创建上传目录
                            String uploadPath = "C:/Users/csl/Desktop/feishu_project(1)/feishu_project/uploads/avatar";
                            File uploadDir = new File(uploadPath);
                            if (!uploadDir.exists()) {
                                uploadDir.mkdirs();//递归创建目录//
                                // mkdirs()会自动创建所有不存在的父目录（如路径中的uploads不存在也会创建）
                            }

                            //保存文件到硬盘
                            String filePath = uploadPath + File.separator + fileName;
                            File storeFile = new File(filePath);
                            // 保存文件到硬盘
                            item.write(storeFile);
                            // 设置UserDto的avatar属性
                            userDto.setAvatarUrl("/avatar/" + fileName);
                        }                      //  //设置头像访问路径
                    }
                }
//            UserDto updateUser = objectMapper.readValue(req.getReader(), UserDto.class);
//            User user = (User) session.getAttribute("user");
//            String url = "";
//            if (updateUser.getAvatar() != null && updateUser.getAvatar().length() > 0) {
//                //上传头像
//                url = handleAvatarUpload((Part)updateUser.getAvatar(),user.getUserId());
//            }
//            user.setAvatarUrl(url);
//            //更新用户信息
//            userService.updateUser(user);
            }
            userService.updateUser(userDto);
            responseJson.put("code", 200);
            responseJson.put("message", "修改成功");
        } catch (NumberFormatException e) {
            responseJson.put("code", 400);
            responseJson.put("message", "ID格式错误");
            resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (SQLException e) {
            responseJson.put("code", 500);
            responseJson.put("message", "系统内部错误");
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        } catch (Exception e) {
            responseJson.put("code", 500);
            responseJson.put("message", "处理请求时发生错误");
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        } finally {
            resp.getWriter().print(responseJson.toString());
        }
    }

}
